home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 42 / Amiga Format AFCD42 (Issue 126, Aug 1999).iso / -serious- / programming / other / wild / include / pypermacro.i < prev    next >
Text File  |  1999-05-25  |  5KB  |  279 lines

  1.         IFND    PYPERMACRO
  2. PYPERMACRO    SET    1
  3. Call    MACRO
  4.     JSR    _LVO\1(a6)
  5.     ENDM
  6.  
  7. Exec    MACRO
  8.     movea.l    4.w,a6
  9.     ENDM
  10.     
  11. mousewait    MACRO
  12. mwa\@        move.w    $dff106,d0
  13.         and.w    #\1,d0
  14.         move.w    d0,$dff180
  15.         btst    #6,$bfe001
  16.         beq.b    mwa\@
  17. mwb\@        move.w    $dff106,d0
  18.         or.w    #\1,d0
  19.         move.w    d0,$dff180
  20.         btst    #6,$bfe001
  21.         bne.b    mwb\@
  22.         ENDM
  23.  
  24. GetTagData    MACRO    ; tag,default,taglist    [A6 must be uty base]
  25.         movea.l    \3,a0
  26.         move.l    #\1,d0
  27.         move.l    #\2,d1
  28.         Call    GetTagData
  29.         ENDM
  30.  
  31. FindGetData    MACRO    ; tag,taglist,faillabel
  32.         movea.l    \2,a0
  33.         move.l    #\1,d0
  34.         Call    FindTagItem
  35.         tst.l    d0
  36.         beq    \3
  37.         movea.l    d0,a0
  38.         movea.l    4(a0),d0
  39.         ENDM
  40.         
  41. FindTag        MACRO    ; tag,taglist
  42.         movea.l    \2,a0
  43.         move.l    #\1,d0
  44.         Call    FindTagItem
  45.         ENDM
  46.  
  47. SetTagData    MACRO    ; tag,value,taglist
  48.         FindTag    \1,\3
  49.         tst.l    d0
  50.         beq.b    .no\@
  51.         movea.l    d0,a0
  52.         move.l    \2,4(a0)
  53. .no\@
  54.         ENDM
  55.         
  56. bxxxm    MACRO    ; \1(bit),\2offset,\3=Ax,\4=xxx
  57.     IFLT    \1-8
  58.     b\4    #\1,\2+3(\3)
  59.     ELSE
  60.     IFLT    \1-16
  61.     b\4    #\1-8,\2+2(\3)
  62.     ELSE
  63.     IFLT    \1-24
  64.     b\4    #\1-16,\2+1(\3)
  65.     ELSE
  66.     IFLT    \1-32
  67.     b\4    #\1-24,\2(\3)
  68.     ELSE
  69.     illegal
  70.     ENDC
  71.     ENDC
  72.     ENDC
  73.     ENDC
  74.     ENDM
  75.  
  76. bclrm    MACRO    
  77.     bxxxm    \1,\2,\3,clr
  78.     ENDM
  79.     
  80. bsetm    MACRO    
  81.     bxxxm    \1,\2,\3,set
  82.     ENDM
  83.  
  84. btstm    MACRO    
  85.     bxxxm    \1,\2,\3,tst
  86.     ENDM
  87.  
  88. bchgm    MACRO    
  89.     bxxxm    \1,\2,\3,chg
  90.     ENDM
  91.     
  92. TRUE    EQU    -1
  93. FALSE    EQU    0    
  94.  
  95. mulu64    MACRO
  96.     mulu.l    \1,\2:\3
  97.     ENDM
  98.  
  99. divu64    MACRO
  100.     divu.l    \1,\2:\3
  101.     ENDM
  102.     
  103. muls64    MACRO
  104.     muls.l    \1,\2:\3
  105.     ENDM
  106.  
  107. divs64    MACRO
  108.     divs.l    \1,\2:\3
  109.     ENDM    
  110.     
  111. mulsn        MACRO    ; 32*32=32 HiPrecision.        \1,\2,\3(skr)
  112.         muls64    \1,\3,\2
  113.         move.w    \3,\2
  114.         swap    \2
  115.         ENDM
  116.  
  117. mulun        MACRO    ; 32*32=32 HiPrecision.        \1,\2,\3(skr)
  118.         mulu64    \1,\3,\2
  119.         move.w    \3,\2
  120.         swap    \2
  121.         ENDM
  122.  
  123.  
  124. ; Obsolete: use PyTree instead, wich is faster for big numbers because of a table.
  125. ; If you know your number to be little, you can use this. Or if you need a small
  126. ; routine to stay in cache. Try them, then select.
  127.  
  128. PyRadix        MACRO    ; \1=dx(a^2) \2=dy=a     IF \1<0, returns 0 !!!
  129.         moveq.l    #-1,\2
  130. .subloop\@    addq.l    #2,\2
  131.         sub.l    \2,\1
  132.         bpl.b    .subloop\@
  133.         lsr.l    #1,\2
  134.         ENDM
  135.  
  136. ; PyTree macro: calcs the sqr of a number, using a scalable table.
  137. ; WARNING: NEGATIVE NUMBERS GIVE ABSURDE RESULTS! NO INTERNAL CHECK!
  138. ; Optimization 1. Eliminate cmps, use only a unique sub at start.
  139.  
  140. ; OLD !! Use Graham's one instead !! FFFAST and NO TABLE !
  141.  
  142. PyTree    MACRO    ;\1=x \2=Ax pointing to table \3=x^.5(result) \4=skratch
  143.     bra.b    .cyc\@
  144. .jump\@    move.l    (\2),\3
  145.     ble.b    .fnd\@
  146.     lea.l    (\2,\3.l),\2
  147. .cyc\@    move.l    (\2)+,\4
  148.     sub.l    \1,\4
  149.     beq.b    .exact\@
  150.     blt.b    .jump\@
  151.     tst.l    (\2)
  152.     bmi.b    .fnd\@
  153.     addq.l    #8,\2
  154.     bra.b    .cyc\@
  155. .exact\@
  156.     move.l    4(\2),\3
  157.     bra.b    .had\@
  158. .fnd\@    addq.l    #4,\2
  159.     move.l    (\2)+,\3
  160.     beq.b    .had\@
  161.     blt.b    .low\@
  162. .high\@    subq.l    #2,\3
  163.     sub.l    \3,\4
  164.     bgt.b    .high\@
  165.     bra.b    .had\@
  166. .low\@    add.l    \3,\4
  167.     addq.l    #2,\3
  168.     ble.b    .low\@
  169.     subq.l    #2,\3
  170. .had\@    lsr.l    #1,\3
  171.     ENDM
  172.  
  173. *    move.l    #896*896,d0
  174. *    lea.l    Table,a0
  175. *    PyTree    d0,a0,d1,d2
  176. *    rts
  177. *Table    incbin    "ram:pytree.table"
  178.     
  179. ; Tested with 900*900: ok,exact (goes into high cycle)
  180. ; Tested with 900*900+1: ok,same
  181. ; Tested with 895*895: ok,exact (goes into low cycle)
  182. ; Tested with 895*895+1: BAD, gives 896. correct !
  183. ; ReTested with 895*895+1: ok,gives 895
  184. ; ReTested with 895*895: ok,gives 895
  185. ; Tested with 896*896: ok,gives 896, BUT DOES THE low CYCLE! 896 is in the table! must do directly!
  186. ; ReTested with 896*896: ok,does directly.
  187. ; Post-Opt1:
  188. ; ReTested with 896*896: ok,gives 896 (no more directly,table changed.)
  189.  
  190. ; Profiler info: PyTree is faster than PyRadix, MUCH faster, with quite big values 
  191. ; (from 200 and more,...)
  192.  
  193. PySqrt    MACRO    ; \1=a^2 \2=a \3 skr \4 skr
  194.     moveq    #1,\2        ;thank goes to  
  195.     ror.l    #2,\2        ;Graham for this 
  196.         moveq   #32,\3        ;fast and short sqrter 
  197. .l2n 
  198.         move.l  \2,\4 
  199.         rol.l   \3,\4 
  200.         add.w   \2,\2 
  201.         cmp.l   \4,\1 
  202.         bcs.b   .no 
  203.         addq.w  #1,\2 
  204.         sub.l   \4,\1 
  205. .no 
  206.         subq.w  #2,\3 
  207.         bgt.b   .l2n 
  208.         andi.l    #$0000ffff,\2
  209.     ENDM 
  210.  
  211. BrowseList    MACRO    ; \1=Label,\2=Ax \3=ListHeader (loaded by lea.l \3,\2)
  212.         IFNC    '','\3'
  213.         lea.l    \3,\2
  214.         ENDC
  215.         bra    \1_END
  216. \1
  217.         ENDM
  218.  
  219. BrowseListEnd    MACRO    ; \1=Label,\2=Ax
  220. \1_END        TSTNODE    \2,\2
  221.         bne    \1
  222.         ENDM
  223.  
  224. BrowseArray    MACRO    ; \1=Label
  225.         bra    \1_END
  226. \1
  227.         ENDM
  228.  
  229. BrowseArrayEnd    MACRO    ; \1=Label,\2=Ax array,\3=Ax Item, d0 skr !!!
  230. \1_END        movea.l    (\2)+,\3
  231.         move.l    \3,d0
  232.         bne    \1
  233.         ENDM
  234.         
  235. ;----------------- DEBUG MACROS -------------------------------------------------------
  236.  
  237. BeNasty        MACRO
  238. NastyCode    SET    1
  239.         ENDM
  240.  
  241. NoNasty        MACRO
  242. NastyCode    SET    0
  243.         ENDM        
  244. NastyBK        MACRO
  245.         IFD    NastyCode
  246.         IFNE    NastyCode
  247.         illegal
  248.         ENDC
  249.         ENDC
  250.         ENDM
  251.         
  252. ;----------------- stack taglists -------------------------------
  253.  
  254. TagStkGet    MACRO    
  255. STAKKEDTAGS    SET    0
  256.         clr.l    -(a7)
  257.         ENDM
  258.  
  259. TagStk        MACRO    ; \1=tagvalue (without #),\2=tag data (<ea>)
  260. STAKKEDTAGS    SET    STAKKEDTAGS+1
  261.         move.l    \2,-(a7)
  262.         move.l    #\1,-(a7)
  263.         ENDM
  264.  
  265. TagStkAx    MACRO    ;\1=ax
  266.         IFC    '','\1'
  267.         movea.l    a7,a1
  268.         ELSE
  269.         movea.l    a7,\1
  270.         ENDC
  271.         ENDM
  272.         
  273. TagStkPop    MACRO
  274.         IFNE    STAKKEDTAGS
  275.         lea.l    STAKKEDTAGS*8+4(a7),a7
  276.         ENDC
  277.         ENDM
  278.  
  279.         ENDC